I'm not totally familiar with FFTs so I can't offer any advice on them. But I can tell you that using linear interpolation you can effectively choose a resolution and be guaranteed to not miss any samples within that resolution. Since there are an infinite amount of values between two numbers it's impossible to recreate every single value between samples. But if you linear interpolate over enough samples you could simulate what the actual sample there would be.
| - points gained by linear interpolation
resolution of about 3 - 3 new points
Sample1.......................|................... ........|...........................|............. ............Sample2
Sample1......................(.25)................ .....(.50)...................(.75)................ ......Sample2
So draw your original wave or line from sample 1 to sample2 -> you are obviously missing a lot of information if the sampling rate is low. So to gain more resolution than is actually available you can linear interpolate it.
For instance if you have 10000 samples and use a resolution of .1 - you gain 10 more samples between each of the 10000 which would bring the total to 10000*10 samples. The obvious problem here is memory but speed should not be a concern.
Code:
float LinearInterpolate(float fV1,float fV2,float fInterp)
{
return (fV1+fInterp*(fV2-fV1));
}
Code:
float LinearInterpolate_ASM(float fV1,float fV2,float fInterp)
{
//Assuming parameters are pushed right to left
//fInterp - ebp+8
//fV2 - ebp+12
//fV1 - ebp+16
asm {
push ebp
mov ebp,esp
fld [ebp+12]
fsub [ebp+16]
fmul [ebp+8]
fadd [ebp+16]
pop ebp
ret
}
}
I'm not sure if you need the (push ebp - mov ebp,esp) stuff because I think the compiler will do that for you. In fact you might be pushing ebp twice if you do it my way. Check your compiler documentation about how to access parameters - you could just access them using their C names as well.
Of course you could just use the good old sine filter - but either way you are trying to get more samples than what you currently have. If you have time information (sample period info) and sample value information then you have enough info to discretely sample the wave for all unknown points. It will effectively turn a jagged digital wave into a somewhat more natural wave.
Note that this is also assuming that your wave or your data progresses in linear fashion. That is if there is some unknown non-linearity between sample1 and sample2 the linear interpolation function will NOT find the correct value for the discrete samples following the non-linearity.
This picture from Sony's Sound Forge shows the problem I'm talking about. If you only know sample 1 and sample 2 and you linear interpolate along that line -> the non-linearity will be skipped. Of course in this example linear interpolating between 1 and 2 will yield next to nothing since both samples lie on a wave crest so you will just get a straight line from 1 to 2....but I hope it shows what I'm talking about. Essentially any non-linearites between samples will be lost during linear interpolation.